home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack7a.sfx / hack#7b.txt < prev   
Text File  |  1990-02-12  |  40KB  |  909 lines

  1.  ├000   ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═      -
  2. -----------------------------------------------------------------------------
  3.  ┬000
  4.         ┬┴╙╔├   ╥┴═     ╥┴═     ╥┴═     ╥┴═     ┬┴╙╔├   ╥╧═╚    ╥╧═╚     -
  5.  ┴000
  6. -----------------------------------------------------------------------------
  7.  9000
  8.         ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥╧═╠    ╥┴═     ╥╧═╠    ╥╧═╠(*
  9.  8000
  10. -----------------------------------------------------------------------------
  11.  7000
  12.  
  13.  6000
  14.         ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═      -
  15.  5000
  16.  
  17.  4000
  18. -----------------------------------------------------------------------------
  19.  3000    
  20.  
  21.  2000   ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═      -
  22.  
  23.  1000
  24. -----------------------------------------------------------------------------
  25.  0000   ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═     ╥┴═
  26. -----------------------------------------------------------------------------
  27.  
  28.     *) ╔NTERNAL MEMORY DOES NOT RESPOND TO WRITE ACCESSES TO THESE AREAS.
  29.  
  30.  
  31.     ╠EGEND: ╦ERNAL      ┼000-╞╞╞╞       ╦ERNAL ╥╧═.
  32.  
  33.             ╔╧/├        ─000-─╞╞╞       ╔/╧ ADDRESS SPACE OR ├HARACTER
  34.                                         GENERATOR ╥╧═, SELECTED BY -├╚┴╥┼╬.
  35.                                         ╔F THE ├╚┴╥┼╬ BIT IS CLEAR,
  36.                                         THE CHARACTER GENERATOR ╥╧═ IS
  37.                                         CHOSEN. ╔F IT IS SET, THE
  38.                                         ╔/╧ CHIPS ARE ACCESSIBLE.
  39.  
  40.             ╔╧/╥┴═      ─000-─╞╞╞       ╔/╧ ADDRESS SPACE OR ╥┴═,
  41.                                         SELECTED BY -├╚┴╥┼╬.
  42.                                         ╔F THE ├╚┴╥┼╬ BIT IS CLEAR,
  43.                                         THE CHARACTER GENERATOR ╥╧═ IS
  44.                                         CHOSEN. ╔F IT IS SET, THE
  45.                                         INTERNAL ╥┴═ IS ACCESSIBLE.
  46.  
  47.             ╔/╧         ─000-─╞╞╞       ╔/╧ ADDRESS SPACE.
  48.                                         ╘HE -├╚┴╥┼╬ LINE HAS NO EFFECT.
  49.  
  50.             ┬┴╙╔├       ┴000-┬╞╞╞       ┬┴╙╔├ ╥╧═.
  51.  
  52.             ╥╧═╚        ┴000-┬╞╞╞ OR    ┼XTERNAL ╥╧═ WITH THE -╥╧═╚ LINE
  53.                         ┼000-╞╞╞╞       CONNECTED TO ITS -├╙ LINE.
  54.  
  55.             ╥╧═╠        8000-9╞╞╞       ┼XTERNAL ╥╧═ WITH THE -╥╧═╠ LINE
  56.                                         CONNECTED TO ITS -├╙ LINE.
  57.  
  58.             ╥┴═         VARIOUS RANGES  ├OMMODORE 64'S INTERNAL ╥┴═.
  59.  
  60.             -           1000-7╞╞╞ AND   ╧PEN ADDRESS SPACE. 
  61.                         ┴000-├╞╞╞       ╘HE ├OMMODORE 64'S MEMORY CHIPS
  62.                                         DO NOT DETECT ANY MEMORY ACCESSES
  63.                                         TO THIS AREA EXCEPT THE ╓╔├-╔╔'S
  64.                                         ─═┴ AND MEMORY REFRESHES.
  65.  
  66.     ╬╧╘┼:   ╫HENEVER THE PROCESSOR TRIES TO WRITE TO ANY ╥╧═ AREA
  67.             (╦ERNAL, ┬┴╙╔├, ├╚┴╥╧═, ╥╧═╠, ╥╧═╚), THE DATA WILL GET
  68.             "THROUGH THE ╥╧═" TO THE ├64'S INTERNAL ╥┴═.
  69.  
  70.             ╞OR THIS REASON, YOU CAN EASILY COPY DATA FROM ╥╧═ TO ╥┴═,
  71.             WITHOUT ANY BANK SWITCHING. ┬UT IMPLEMENTING EXTERNAL
  72.             MEMORY EXPANSIONS WITHOUT ─═┴ IS VERY HARD, AS YOU HAVE TO
  73.             USE THE ╒LTIMAX MEMORY CONFIGURATION, OR THE DATA WILL BE
  74.             WRITTEN BOTH TO INTERNAL AND EXTERNAL ╥┴═.
  75.  
  76.             ╚OWEVER, THIS IS NOT TRUE FOR THE ╒LTIMAX GAME
  77.             CONFIGURATION. ╔N THAT MODE, THE INTERNAL ╥┴═ IGNORES ALL
  78.             MEMORY ACCESSES OUTSIDE THE AREA $0000-$0╞╞╞, UNLESS THEY ARE
  79.             PERFORMED BY THE ╓╔├, AND YOU CAN WRITE TO EXTERNAL MEMORY
  80.             AT $1000-$├╞╞╞ AND $┼000-$╞╞╞╞, IF ANY, WITHOUT CHANGING
  81.             THE CONTENTS OF THE INTERNAL ╥┴═.
  82.  
  83.  
  84. _┴ NOTE CONCERNING THE ╔/╧ AREA_
  85.  
  86.   ╘HE ╔/╧ AREA IS DIVIDED AS FOLLOWS:
  87.  
  88.      ┴DDRESS RANGE  ╧WNER
  89.      -------------  -----
  90.        ─000-─3╞╞    ═╧╙ 6567/6569 ╓╔├-╔╔ ╓IDEO ╔NTERFACE ├ONTROLLER
  91.        ─400-─7╞╞    ═╧╙ 6581 ╙╔─ ╙OUND ╔NTERFACE ─EVICE
  92.        ─800-─┬╞╞    ├OLOR ╥┴═ (ONLY LOWER NYBBLES ARE CONNECTED)
  93.        ─├00-─├╞╞    ═╧╙ 6526 ├╔┴ ├OMPLEX ╔NTERFACE ┴DAPTER #1
  94.        ──00-──╞╞    ═╧╙ 6526 ├╔┴ ├OMPLEX ╔NTERFACE ┴DAPTER #2
  95.        ─┼00-─┼╞╞    ╒SER EXPANSION #1 (-╔/╧1 ON ┼XPANSION ╨ORT)
  96.        ─╞00-─╞╞╞    ╒SER EXPANSION #2 (-╔/╧2 ON ┼XPANSION ╨ORT)
  97.  
  98.   ┴S YOU CAN SEE, THE ADDRESS RANGES FOR THE CHIPS ARE MUCH LARGER
  99. THAN REQUIRED. ┬ECAUSE OF THIS, YOU CAN ACCESS THE CHIPS THROUGH
  100. MULTIPLE MEMORY AREAS. ╘HE ╓╔├-╔╔ APPEARS IN ITS WINDOW EVERY $40
  101. ADDRESSES. ╞OR INSTANCE, THE ADDRESSES $─040 AND $─080 ARE BOTH MAPPED
  102. TO THE ╙PRITE 0 ╪ CO-ORDINATE REGISTER. ╘HE ╙╔─ HAS ONE REGISTER
  103. SELECTION LINE LESS, THUS IT APPEARS AT EVERY $20 BYTES. ╘HE ├╔┴
  104. CHIPS HAVE ONLY 16 REGISTERS, SO THERE ARE 16 COPIES OF EACH IN THEIR
  105. MEMORY AREA.
  106.  
  107.   ╚OWEVER, YOU SHOULD NOT USE OTHER ADDRESSES THAN THOSE SPECIFIED BY
  108. ├OMMODORE. ╞OR INSTANCE, THE ├OMMODORE 128 MAPPED ITS ADDITIONAL ╔/╧
  109. CHIPS TO THIS SAME MEMORY AREA, AND THE ╙╔─ RESPONDS ONLY TO THE
  110. ADDRESSES ─400-─4╞╞, ALSO WHEN IN ├64 MODE. ┴ND THE ├OMMODORE 65,
  111. WHICH UNFORTUNATELY DID NOT MAKE ITS WAY TO THE MARKET, COULD NARROW
  112. THE MEMORY WINDOW RESERVED FOR THE ═╧╙ 6569/6567 ╓╔├-╔╔ (OR ├╙╟ 4567
  113. ╓╔├-╔╔╔ IN THAT MACHINE).
  114.  
  115.  
  116. _╘HE VIDEO CHIP_
  117.  
  118.   ╘HE ═╧╙ 6567/6569 ╓╔├-╔╔ ╓IDEO ╔NTERFACE ├ONTROLLER HAS ACCESS TO
  119. ONLY 16 KILOBYTES AT A TIME. ╘O ENABLE THE ╓╔├-╔╔ TO ACCESS THE WHOLE
  120. 64 K┬ MEMORY SPACE, THE MAIN MEMORY IS DIVIDED TO FOUR BANKS OF 16 K┬
  121. EACH. ╘HE LINES ╨┴0 AND ╨┴1 OF THE SECOND ├╔┴ ARE THE INVERSE OF THE
  122. VIRTUAL ╓╔├-╔╔ ADDRESS LINES ╓┴14 AND ╓┴15, RESPECTIVELY. ╘O SELECT A
  123. ╓╔├-╔╔ BANK OTHER THAN THE DEFAULT, YOU MUST PROGRAM THE ├╔┴ LINES TO
  124. OUTPUT THE DESIRED BIT PAIR. ╞OR INSTANCE, THE FOLLOWING CODE SELECTS
  125. THE MEMORY AREA $4000-$7╞╞╞ (BANK 1) FOR THE VIDEO CONTROLLER:
  126.  
  127.     ╠─┴ $──02 ; ─ATA ─IRECTION ╥EGISTER ┴
  128.     ╧╥┴ #$03  ; ╙ET PINS ╨┴0 AND ╨┴1 TO OUTPUTS
  129.     ╙╘┴ $──02
  130.     ╠─┴ $──00
  131.     ┴╬─ #$╞├  ; ═ASK THE LOWMOST BIT PAIR OFF
  132.     ╧╥┴ #$02  ; ╙ELECT ╓╔├-╔╔ BANK 1 (THE INVERSE OF BINARY 01 IS 10)
  133.     ╙╘┴ $──00
  134.  
  135.   ╫HY SHOULD YOU SET THE PINS TO OUTPUTS? ╚ARDWARE ╥┼╙┼╘ RESETS ALL
  136. ╔/╧ LINES TO INPUTS, AND THANKS TO THE ├╔┴'S INTERNAL PULL-UP
  137. RESISTORS, THE INPUTS ACTUALLY OUTPUT LOGICAL HIGH VOLTAGE LEVEL. ╙O,
  138. UPON -╥┼╙┼╘, THE VIDEO BANK 0 IS SELECTED AUTOMATICALLY, AND OLDER
  139. ╦ERNALS COULD LEAVE IT UNINITIALIZED.
  140.  
  141.   ╬OTE THAT THE ╓╔├-╔╔ ALWAYS FETCHES ITS INFORMATION FROM THE
  142. INTERNAL ╥┴═, TOTALLY IGNORING THE MEMORY CONFIGURATION LINES. ╘HERE
  143. IS ONLY ONE EXCEPTION TO THIS RULE: ╘HE CHARACTER GENERATOR ╥╧═.
  144. ╒NLESS THE ╒LTIMAX MODE IS SELECTED, ╓╔├-╔╔ "SEES" CHARACTER GENERATOR
  145. ╥╧═ IN THE MEMORY AREAS 1000-1╞╞╞ AND 9000-9╞╞╞. ╔F THE ╒LTIMAX
  146. CONFIGURATION IS ACTIVE, THE ╓╔├-╔╔ WILL FETCH ALL DATA FROM THE
  147. INTERNAL ╥┴═.
  148.  
  149.  
  150. _┴N APPLICATION: ═AKING AN OPERATING SYSTEM EXTENSION_
  151.  
  152.   ╔F YOU ARE MAKING A MEMORY RESIDENT PROGRAM AND WANT TO MAKE IT AS
  153. INVISIBLE TO THE SYSTEM AS POSSIBLE, PROBABLY THE BEST METHOD IS
  154. KEEPING MOST OF YOUR CODE UNDER THE ╔/╧ AREA (IN THE ╥┴═ AT
  155. $─000-$─╞╞╞). ╘HIS AREA IS VERY SAFE, SINCE PROGRAMS UTILIZING IT ARE
  156. RARE, SINCE THEY ARE VERY DIFFICULT TO IMPLEMENT AND TO DEBUG. ┘OU
  157. NEED ONLY A SHORT ROUTINE IN THE NORMALLY VISIBLE ╥┴═ THAT PUSHES THE
  158. CURRENT VALUE OF THE PROCESSOR'S ╔/╧ REGISTER $01 ON STACK, SWITCHES
  159. ╥┴═ ON TO $─000-$─╞╞╞ AND JUMPS TO THIS AREA. ╥ETURNING FROM THE
  160. $─000-$─╞╞╞ AREA IS POSSIBLE EVEN WITHOUT ANY ROUTINE IN THE NORMALLY
  161. VISIBLE ╥┴═ AREA. ╩UST WRITE AN ╥╘╙ OR AN ╥╘╔ TO AN ╔/╧ REGISTER AND
  162. RETURN THROUGH IT.
  163.  
  164.   ┬UT WHAT IF YOUR PROGRAM NEEDS TO USE ╔/╧? ┴ND HOW CAN YOU WRITE THE
  165. RETURN INSTRUCTION TO AN ╔/╧ REGISTER WHILE THE ╔/╧ AREA IS SWITCHED
  166. OFF? ┘OU NEED A SWAP AREA FOR YOUR PROGRAM IN NORMALLY VISIBLE MEMORY.
  167. ╘HE FIRST THING YOUR ROUTINE AT $─000-$─╞╞╞ DOES IS COPYING THE ╔/╧
  168. ROUTINES (OR THE WHOLE PROGRAM) TO NORMALLY VISIBLE MEMORY, SWAPPING
  169. THE BYTES. ╞OR INSTANCE, IF YOUR ╔/╧ ROUTINES ARE INITIALLY BEING
  170. STORED AT $─200-$─3╞╞, EXCHANGE THE BYTES IN $─200-$─3╞╞ WITH THE
  171. CONTENTS OF $├000-$├1╞╞. ╬OW YOU CAN CALL THE ╔/╧ ROUTINES FROM YOUR
  172. ROUTINE AT $─000-$─╞╞╞, AND THE ╔/╧ ROUTINES CAN SWITCH THE ╔/╧ AREA
  173. TEMPORARILY ON TO ACCESS THE ╔/╧ CHIPS. ┴ND RIGHT BEFORE EXITING YOUR
  174. PROGRAM AT $─000-$─╞╞╞ SWAPS THE OLD CONTENTS OF THAT ╔/╧ ROUTINE AREA
  175. IN, E.G. EXCHANGES THE MEMORY AREAS $─200-$─3╞╞ AND $├000-$├1╞╞
  176. AGAIN.
  177.  
  178.   ╫HAT ╔/╧ REGISTERS CAN YOU USE FOR THE RETURN INSTRUCTION? ╘HERE ARE
  179. BASICALLY TWO ALTERNATIVES: 8-BIT ╓╔├ SPRITE REGISTERS OR EITHER ├╔┴'S
  180. SERIAL PORT REGISTER. ╘HE ╓╔├ REGISTERS ARE EASIEST TO USE, AS THEY
  181. ACT PRECISELY LIKE MEMORY PLACES: YOU CAN EASILY WRITE THE DESIRED
  182. VALUE TO A REGISTER. ┬UT THE ├╔┴ REGISTER IS USUALLY BETTER, AS
  183. CHANGING THE ╓╔├ REGISTERS MIGHT CHANGE THE SCREEN LAYOUT.
  184.  
  185.   ╚OWEVER, ALSO THE ╙╨ REGISTER HAS SOME DRAWBACKS: ╔F THE MACHINE'S
  186. ├╬╘1 AND ├╬╘2 LINES ARE CONNECTED TO A FREQUENCY SOURCE, YOU MUST STOP
  187. EITHER ├╔┴'S ╘IMER ┴ TO USE THE ╙╨ REGISTER METHOD. ╬ORMALLY THE 1ST
  188. ├╔┴'S ╘IMER ┴ IS THE MAIN HARDWARE INTERRUPT SOURCE. ┴ND IF YOU USE
  189. THE ╦ERNAL'S ╥╙232, YOU CANNOT STOP THE 2ND ├╔┴'S ╘IMER ┴ EITHER. ┴LSO,
  190. IF YOU DON'T WANT TO LOSE ANY ├╔┴ INTERRUPTS, YOU MIGHT WANT TO KNOW
  191. THAT EXECUTING THE ╥╘╙ OR ╥╘╔ AT ╙╨ REGISTER HAS THE SIDE EFFECT OF
  192. READING THE ╔NTERRUPT ├ONTROL ╥EGISTER, THUS ACKNOWLEDGING AN INTERRUPT
  193. THAT MIGHT HAVE BEEN WAITING.
  194.  
  195.   ╔F YOU CAN'T USE EITHER METHOD, YOU CAN USE EITHER ├╔┴'S ╘O─ SECONDS
  196. OR MINUTES OR ╘O─ ALARM TIME FOR STORING AN ╥╘╔. ╧R, IF YOU DON'T WANT
  197. TO ALTER ANY REGISTERS, USE THE ╓╔├-╔╔'S LIGHT PEN REGISTER. ┬EFORE
  198. EXITING, WAIT FOR APPROPRIATE RASTER LINE AND TRIG THE LIGHT PEN LATCH
  199. WITH ├╔┴1'S ╨┬4 BIT. ╚OWEVER, THIS METHOD ASSUMES THAT THE CONTROL
  200. PORT 1'S BUTTON/LIGHT PEN LINE REMAINS UP FOR THAT FRAME. ┴FTER
  201. TRIGGING THE LIGHT PEN, CAUSING THE LIGHT PEN ┘ CO-ORDINATE REGISTER
  202. ($─014) TO BE $40 OR $60, YOU HAVE MORE THAN HALF A FRAME TIME TO
  203. RESTORE THE STATE OF THE ╔/╧ CHIPS AND RETURN THROUGH THE REGISTER.
  204.  
  205.   ┘OU CAN ALSO USE THE ╙╔─ TO STORE AN ╥╘╔ OR ╥╘╙ COMMAND. ╚OW IS THIS
  206. POSSIBLE, YOU MIGHT ASK. ┴FTER ALL, THE CHIP CONSISTS OF READ ONLY OR
  207. WRITE ONLY REGISTERS. ╚OWEVER, THERE ARE TWO REGISTERS THAT CAN BE
  208. CONTROLLED BY PROGRAM, THE ENVELOPE GENERATOR AND OSCILLATOR OUTPUTS
  209. OF THE THIRD VOICE. ╘HIS METHOD REQUIRES YOU TO CHANGE THE FREQUENCY
  210. OF VOICE 3 AND TO SELECT A WAVEFORM FOR IT. ╘HIS WILL AFFECT ON THE
  211. VOICE OUTPUT BY TURNING THE VOICE 3 OFF, BUT WHO WOULD KEEP THE VOICE
  212. 3 PRODUCING A TONE WHILE CALLING AN OPERATING SYSTEM ROUTINE?
  213.  
  214.   ┴LSO KEEP IN MIND THAT THE USER COULD PRESS ╥┼╙╘╧╥┼ WHILE THE ╦ERNAL
  215. ╥╧═ AND ╔/╧ AREAS ARE DISABLED. ┘OU COULD WRITE YOUR OWN NON-MASKABLE
  216. INTERRUPT (╬═╔) HANDLER (USING THE ╬═╔ VECTOR AT $╞╞╞┴), BUT A FAST
  217. LOADER THAT USES VERY TIGHT TIMING WOULD STILL STOP WORKING IF THE
  218. USER PRESSED ╥┼╙╘╧╥┼ IN THE MIDDLE OF A DATA BLOCK TRANSFER. ╙O, TO
  219. MAKE A ROBUST PROGRAM, YOU HAVE TO DISABLE ╬═╔ INTERRUPTS. ┬UT HOW IS
  220. THIS POSSIBLE? ╘HEY ARE ╬ON-═ASKABLE AFTER ALL. ╘HE ╬═╔ INTERRUPT IS
  221. EDGE-SENSITIVE, THE PROCESSOR JUMPS TO ╬═╔ HANDLER ONLY WHEN THE -╬═╔
  222. LINE DROPS FROM +5╓ TO GROUND. ╘O DISABLE THE INTERRUPT, SIMPLY CAUSE
  223. AN ╬═╔ WITH ├╔┴2'S TIMER, BUT DON'T READ THE ╔NTERRUPT ├ONTROL
  224. REGISTER. ╔F YOU NEED TO READ $──0─ IN YOUR PROGRAM, YOU MUST ADD A
  225. ╬═╔ HANDLER JUST IN CASE THE USER PRESSES ╥┼╙╘╧╥┼. ┴ND DON'T FORGET TO
  226. RAISE THE -╬═╔ LINE UPON EXITING THE PROGRAM.  ╧THERWISE THE ╥┼╙╘╧╥┼
  227. KEY DOES NOT WORK UNTIL THE USER ISSUES A -╥┼╙┼╘ OR READS THE ╔├╥
  228. REGISTER EXPLICITLY. (╘HE ╦ERNAL DOES NOT READ $──0─, UNLESS IT IS
  229. HANDLING AN INTERRUPT.) ╘HIS CAN BE DONE AUTOMATICALLY BY THE TWO
  230. FOLLOWING ╙╨ REGISTER EXAMPLES DUE TO ONE OF THE 6510'S UNDOCUMENTED
  231. FEATURES (REFER TO THE DESCRIPTIONS OF ╥╘╙ AND ╥╘╔ BELOW).
  232.  
  233.         ; ╥ETURNING VIA ╓╔├ SPRITE 7 ╪ CO-ORDINATE REGISTER
  234.  
  235.         ╔NITIALIZATION:   ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
  236.                 ╠─┴ #$60
  237.                 ╙╘┴ $─015 ; ╫RITE ╥╘╙ TO ╓╔├ REGISTER $15.
  238.  
  239.         ┼XITING:          ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ╓╔├ REGISTER
  240.                           ; $12. ┘OU HAVE MULTIPLE ALTERNATIVES, AS THE ╓╔├
  241.                           ; APPEARS IN MEMORY AT $─000+$40*N, WHERE $0<=N<=$╞.
  242.  
  243.                 ╨╠┴       ; ╨ULL THE SAVED 6510 ╔/╧ REGISTER STATE FROM STACK
  244.                 ╙╘┴ $01   ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
  245.                           ; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM THE
  246.                           ; ╓╔├ REGISTER $15.
  247.  
  248.  
  249.         ; ╥ETURNING VIA ├╔┴ 2'S ╘O─ OR ╘O─ ALARM SECONDS REGISTER
  250.  
  251.         ╔NITIALIZATION:   ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
  252.                 ╠─┴ #$40  
  253.                 ╙╘┴ $──08 ; ╙ET ╘O─ TENTHS OF SECONDS
  254.                           ; (CLEAR IT SO THAT THE SECONDS REGISTER
  255.                           ; WOULD NOT OVERFLOW)
  256.                           ; ╔F ╘O─ ALARM REGISTER IS SELECTED, THIS
  257.                           ; INSTRUCTION WILL BE UNNECESSARY.
  258.                 ╙╘┴ $──09 ; ╙ET ╘O─ SECONDS
  259.                 ╠─┴ $──0┬ ; ╥EAD ╘O─ HOURS (FREEZE ╘O─ DISPLAY)
  260.  
  261.         ┼XITING:          ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
  262.                           ; $6. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
  263.                           ; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
  264.                 ╨╠┴
  265.                 ╙╘┴ $01   ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
  266.                           ; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
  267.                           ; THE ├╔┴ 2 REGISTER $9.
  268.  
  269.  
  270.         ; ╥ETURNING VIA ├╔┴ 2'S ╙╨ REGISTER (ASSUMING THAT ├╬╘2 IS STABLE)
  271.  
  272.         ╔NITIALIZATION:   ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
  273.                 ╠─┴ $──0┼ ; ├╔┴ 2'S ├ONTROL ╥EGISTER ┴
  274.                 ┴╬─ #$┬╞  ; ╙ET ╙ERIAL ╨ORT TO INPUT
  275.                 ╙╘┴ $──0┼ ; (MAKE THE ╙╨ REGISTER TO ACT AS A MEMORY PLACE)
  276.                 ╠─┴ #$60
  277.                 ╙╘┴ $──0├ ; ╫RITE ╥╘╙ TO ├╔┴ 2 REGISTER $├.
  278.  
  279.         ┼XITING:          ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
  280.                           ; $9. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
  281.                           ; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
  282.                 ╨╠┴
  283.                 ╙╘┴ $01   ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
  284.                           ; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
  285.                           ; THE ├╔┴ 2 REGISTER $├.
  286.  
  287.  
  288.         ; ╥ETURNING VIA ├╔┴ 2'S ╙╨ REGISTER, STOPPING THE ╘IMER ┴
  289.         ; AND FORCING ╙╨2 AND ├╬╘2 TO OUTPUT
  290.  
  291.         ╔NITIALIZATION:   ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
  292.                 ╠─┴ $──0┼ ; ├╔┴ 2'S ├ONTROL ╥EGISTER ┴
  293.                 ┴╬─ #$╞┼  ; ╙TOP ╘IMER ┴
  294.                 ╧╥┴ #$40  ; ╙ET ╙ERIAL ╨ORT TO OUTPUT
  295.                 ╙╘┴ $──0┼ ; (MAKE THE ╙╨ REGISTER TO ACT AS A MEMORY PLACE)
  296.                 ╠─┴ #$60
  297.                 ╙╘┴ $──0├ ; ╫RITE ╥╘╙ TO ├╔┴ REGISTER $├.
  298.  
  299.         ┼XITING:          ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
  300.                           ; $9. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
  301.                           ; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
  302.                 ╨╠┴
  303.                 ╙╘┴ $01   ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
  304.                           ; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
  305.                           ; THE ├╔┴ 2 REGISTER $├.
  306.  
  307.         ; ╥ETURNING VIA ╙╔─ OSCILLATOR 3 OUTPUT REGISTER
  308.  
  309.         ╔NITIALIZATION:   ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
  310.                 ╠─┴ #$20  ; ╙ELECT SAWTOOTH WAVEFORM
  311.                 ╙╘┴ $─412 ; BUT DO NOT ENABLE THE SOUND
  312.                 ╠─┘ #$00  ; ╙ELECT FREQUENCY
  313.                 ╙╘┘ $─40┼ ; (SYSTEM CLOCK)/$╞╞00,
  314.                 ╠─┴ #$╞╞  ; CAUSING THE ╧╙├3 OUTPUT TO INCREMENT BY ONE
  315.                 ╙╘┘ $─40╞ ; EVERY $10000/$╞╞00 CYCLES.
  316.  
  317.                 ╠─┴ #$0┼
  318.                 ╠─╪ #$60
  319.  
  320.                 ┬╔╘ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3 OUTPUT
  321.                 ┬═╔ *-3   ; TO BE IN THE RANGE
  322.                 ┬╓╙ *-5   ; $00-$3╞.
  323.                 ┬╔╘ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3 OUTPUT
  324.                 ┬╓├ *-3   ; TO BE AT LEAST $40.
  325.  
  326.                 ╙╘┴ $─40╞ ; ╙LOW DOWN THE FREQUENCY TO (SYSTEM CLOCK)/$0┼00.
  327.                 ├╨╪ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3
  328.                 ┬╬┼ *-3   ; OUTPUT TO REACH $60 (╥╘╙)
  329.  
  330.                 ╙╘┘ $─40╞ ; ╥ESET THE FREQUENCY OF VOICE 3
  331.                           ; (STOP THE ╧╙├3 REGISTER FROM INCREASING)
  332.  
  333.         ┼XITING:          ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ╙╔─ REGISTER
  334.                           ; $18. ┴S THE ╙╔─ APPEARS IN MEMORY AT $─400+$20*N,
  335.                           ; WHERE 0<=N<=$20, YOU HAVE THIRTY-TWO ALTERNATIVES.
  336.                           ; ╚OWEVER, IN ├128 THERE ARE ONLY EIGHT ALTERNATIVES,
  337.                           ; AS THE ╙╔─ IS ONLY AT $─400-$─4╞╞.
  338.  
  339.                 ╨╠┴
  340.                 ╙╘┴ $01   ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
  341.                           ; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
  342.                           ; THE ╙╔─ REGISTER $1┬.
  343.  
  344.  
  345.   ╞OR INSTANCE, IF YOU WANT TO MAKE A HIGHLY COMPATIBLE FAST LOADER,
  346. MAKE THE ╔╠╧┴─ VECTOR ($0330) POINT TO THE BEGINNING OF THE STACK
  347. AREA. ╥EMEMBER THAT THE ┬┴╙╔├ INTERPRETER USES THE FIRST BYTES OF
  348. STACK WHILE CONVERTING NUMBERS TO TEXT. ┴ GOOD ADDRESS IS $0120.
  349. ╥OBUST PROGRAMS PRACTICALLY NEVER USE SO MUCH STACK THAT IT COULD
  350. CORRUPT THIS ROUTINE. ╒SUALLY ONLY CRUNCHED PROGRAMS (DEMOS AND ALIKE)
  351. USE ALL STACK IN THE DECOMPRESSION PHASE. ╘HEY ALSO MAKE USE OF THE
  352. $─000-$─╞╞╞ AREA.
  353.  
  354.   ╘HIS STACK ROUTINE WILL JUMP TO YOUR ROUTINE AT $─000-$─╞╞╞, AS
  355. DESCRIBED ABOVE. ╞OR PERFORMANCE'S SAKE, COPY THE WHOLE BYTE TRANSFER
  356. LOOP TO THE SWAP AREA, E.G. $├000-$├1╞╞, AND CALL THAT SUBROUTINE
  357. AFTER DOING THE PRELIMINARY WORK. ┬UT WHAT ABOUT FILES THAT LOAD OVER
  358. $├000-$├1╞╞? ╫OULDN'T THAT DESTROY THE TRANSFER LOOP AND JAM THE
  359. MACHINE? ╬OT NECESSARILY. ╔F YOU COPY THOSE BYTES TO YOUR SWAP AREA AT
  360. $─000-$─╞╞╞, THEY WILL BE LOADED PROPERLY, AS YOUR PROGRAM RESTORES
  361. THE ORIGINAL $├000-$├1╞╞ AREA.
  362.  
  363.   ╔F YOU WANT TO MAKE YOUR PROGRAM USER-FRIENDLY, PUT A VECTOR
  364. INITIALIZATION ROUTINE TO THE STACK AREA AS WELL, SO THAT THE USER CAN
  365. RESTORE THE FAST LOADER BY ISSUING A ╙┘╙ COMMAND, RATHER THAN LOADING
  366. IT EACH TIME HE HAS PRESSED ╥┼╙┼╘.
  367.  
  368.  
  369. _┴N EXAMPLE: ┴ "HELLO WORLD" PROGRAM_
  370.  
  371.   ╘O HELP YOU IN GETTING STARTED, ╔ HAVE WRITTEN A SMALL EXAMPLE
  372. PROGRAM THAT ECHOES THE FAMOUS MESSAGE "HELLO, WORLD!" TO STANDARD
  373. OUTPUT (NORMALLY SCREEN) USING THE ╦ERNAL'S ├╚╥╧╒╘ SUBROUTINE. ┴FTER
  374. THE INITIALIZATION ROUTINE HAS BEEN RUN, THE PROGRAM CAN BE STARTED BY
  375. COMMANDING ╙┘╙ 300. ╔ USED THE ├OMMODORE 128'S MACHINE LANGUAGE
  376. MONITOR TO PUT IT UP, BUT IT WAS STILL PRETTY DIFFICULT TO DEBUG THE
  377. PROGRAM. ╚ERE IT IS IN UUENCODED FORMAT:
  378.  
  379. BEGIN 644 HELLO
  380. ═└0@+",─'╟├(╨-├$└└└!╪╔0%(*?┬%└:(,╧3└(╟2╨!╥┴#╫╚╚╬]/└┬=8]╫*╘/=╚
  381. ═┴0%88*4!╩┬╟╪"01╪┴0%,╔-╫╞└:*!├@╫=╚@".!=╫╚├@3=╚═╓.#═╓┬0(╪,╫<8!
  382. ═8*4!2└─#┴0&@#+─╙╨"#2_╪@0]╓┬%└6└┴1$╤23╒<@+$],3$5(┬─┬═^╧](╦?╧_
  383. ═2*─6├?╦_╩<"-^_\@╫-╘@└,!╚├?╧_:(╫┌_╥└=╨"#<╫6┬╚╩0!(╬╧╪"└=└#_@,!
  384. 5┴└&@/[╪└╨+┼─╫9─└╨(╩99-╓($/!@
  385. END
  386.  
  387.   ╔N ORDER TO FULLY UNDERSTAND THE OPERATION OF THIS PROGRAM, YOU NEED
  388. TO KNOW HOW THE INSTRUCTIONS ╥╘╔, ╥╘╙ AND ╨╚┴ WORK. ╘HERE IS SOME WORK
  389. GOING ON TO REVERSE ENGINEER THE ╬═╧╙ 6502 MICROPROCESSOR TO LARGE
  390. EXTENT, AND IT IS NOW KNOWN FOR MOST INSTRUCTIONS WHAT MEMORY PLACES
  391. THEY ACCESS DURING THEIR EXECUTION AND FOR WHAT PURPOSE. ╘HE INTERNAL
  392. PROCEDURES HAVEN'T BEEN DESCRIBED IN DETAIL YET, BUT THESE
  393. DESCRIPTIONS SHOULD BE EASIER TO READ ANYWAY.
  394.  
  395.   ╞OR CURIOSITY, ╔ QUOTE HERE THE DESCRIPTION OF ALL INSTRUCTIONS THAT
  396. USE THE STACK. ╘HE DESCRIPTIONS OF INTERNAL OPERATIONS ARE YET
  397. INACCURATE, BUT THE MEMORY ACCESSES HAVE BEEN VERIFIED WITH AN
  398. OSCILLOSCOPE. ╔ WILL MAIL COPIES THE WHOLE DOCUMENT UPON REQUEST. ╫HEN
  399. FINISHED, THE DOCUMENT WILL BE PUT ON AN ╞╘╨ SITE.
  400.  
  401.  
  402.      ╩╙╥
  403.  
  404.         #  ADDRESS ╥/╫ DESCRIPTION
  405.        --- ------- --- -------------------------------------------------
  406.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  407.         2    ╨├     ╥  FETCH ADDRESS'S LOW BYTE TO LATCH, INCREMENT ╨├
  408.         3  $0100,╙  ╥
  409.         4  $0100,╙  ╫  PUSH ╨├╚ ON STACK, DECREMENT ╙
  410.         5  $0100,╙  ╫  PUSH ╨├╠ ON STACK, DECREMENT ╙
  411.         6    ╨├     ╥  COPY LATCH TO ╨├╠, FETCH ADDRESS'S HIGH BYTE TO
  412.                        LATCH, COPY LATCH TO ╨├╚
  413.  
  414.  
  415.      ╥╘╙
  416.  
  417.         #  ADDRESS ╥/╫ DESCRIPTION
  418.        --- ------- --- -----------------------------------------------
  419.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  420.         2    ╨├     ╥  READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
  421.                        INCREMENT ╨├
  422.         3  $0100,╙  ╥  INCREMENT ╙
  423.         4  $0100,╙  ╥  PULL ╨├╠ FROM STACK, INCREMENT ╙
  424.         5  $0100,╙  ╥  PULL ╨├╚ FROM STACK
  425.         6    ╨├     ╥  INCREMENT ╨├
  426.  
  427.  
  428.      ┬╥╦
  429.  
  430.         #  ADDRESS ╥/╫ DESCRIPTION
  431.        --- ------- --- -----------------------------------------------
  432.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  433.         2    ╨├     ╥  READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
  434.                        INCREMENT ╨├
  435.         3  $0100,╙  ╫  PUSH ╨├╚ ON STACK, DECREMENT ╙
  436.         4  $0100,╙  ╫  PUSH ╨├╠ ON STACK, DECREMENT ╙
  437.         5  $0100,╙  ╫  PUSH ╨ ON STACK (WITH ┬ FLAG SET), DECREMENT ╙,
  438.                        SET ╔ FLAG
  439.         6   $╞╞╞┼   ╥  FETCH ╨├╠
  440.         7   $╞╞╞╞   ╥  FETCH ╨├╚
  441.  
  442.  
  443.      ╥╘╔
  444.  
  445.         #  ADDRESS ╥/╫ DESCRIPTION
  446.        --- ------- --- -----------------------------------------------
  447.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  448.         2    ╨├     ╥  READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
  449.                        INCREMENT ╨├
  450.         3  $0100,╙  ╥  INCREMENT ╙
  451.         4  $0100,╙  ╥  PULL ╨ FROM STACK, INCREMENT ╙
  452.         5  $0100,╙  ╥  PULL ╨├╠ FROM STACK, INCREMENT ╙
  453.         6  $0100,╙  ╥  PULL ╨├╚ FROM STACK
  454.  
  455.  
  456.      ╨╚┴, ╨╚╨
  457.  
  458.         #  ADDRESS ╥/╫ DESCRIPTION
  459.        --- ------- --- -----------------------------------------------
  460.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  461.         2    ╨├     ╥  READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
  462.                        INCREMENT ╨├
  463.         3  $0100,╙  ╫  PUSH REGISTER ON STACK, DECREMENT ╙
  464.  
  465.  
  466.      ╨╠┴, ╨╠╨
  467.  
  468.         #  ADDRESS ╥/╫ DESCRIPTION
  469.        --- ------- --- -----------------------------------------------
  470.         1    ╨├     ╥  FETCH OPCODE, INCREMENT ╨├
  471.         2    ╨├     ╥  READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
  472.                        INCREMENT ╨├
  473.         3  $0100,╙  ╥  INCREMENT ╙
  474.         4  $0100,╙  ╥  PULL REGISTER FROM STACK
  475.  
  476.  
  477.   ╘HE EXAMPLE PROGRAM CONSISTS OF THREE PARTS. ╘HE FIRST PART
  478. TRANSFERS THE OTHER PARTS TO APPROPRIATE MEMORY AREAS. ╘HE SECOND PART
  479. IS LOCATED IN STACK AREA (300-312), AND IT INVOKES THE THIRD PART, THE
  480. MAIN MODULE.
  481.  
  482.   ╘HE LOADER PART ($0801-$08├7) IS AS FOLLOWS:
  483.  
  484.         1993 ╙┘╙2061
  485.  
  486.         080─ ╙┼╔          ─ISABLE INTERRUPTS.
  487.         080┼ ╠─┴ $01
  488.         0810 ╨╚┴          ╙TORE THE STATE OF THE PROCESSOR'S ╔/╧ LINES.
  489.         0811 ┴╬─ #$╞8
  490.         0813 ╙╘┴ $01      ╙ELECT 64 K┬ ╥┴═ MEMORY CONFIGURATION.
  491.  
  492.         0815 ╠─╪ #$0├     ├OPY THE INVOKING PART TO 300-312.
  493.         0817 ╠─┴ $0830,╪
  494.         081┴ ╙╘┴ $012├,╪
  495.         081─ ─┼╪
  496.         081┼ ┬╨╠ $0817
  497.  
  498.         0820 ╠─╪ #$8┬     ├OPY THE MAIN PART TO $──64-$──┼┼.
  499.         0822 ╠─┴ $083├,╪
  500.         0825 ╙╘┴ $──63,╪
  501.         0828 ─┼╪
  502.         0829 ┬╬┼ $0822
  503.  
  504.         082┬ ╨╠┴          ╥ESTORE ORIGINAL MEMORY CONFIGURATION.
  505.         082├ ╙╘┴ $01
  506.         082┼ ├╠╔          ┼NABLE INTERRUPTS.
  507.         082╞ ╥╘╙          ╥ETURN.
  508.  
  509.   ╘HE USER INVOKES THE FOLLOWING PART BY ISSUING ╙┘╙ 300. ╘HIS PART
  510. CHANGES THE MEMORY CONFIGURATION AND JUMPS TO THE MAIN PART.
  511.  
  512.         012├ ╠─┴ $01
  513.         012┼ ╘┴╪          ╙TORE ORIGINAL MEMORY CONFIGURATION TO ╪ REGISTER.
  514.         012╞ ┴╬─ #$╞8
  515.         0131 ╧╥┴ #$04
  516.         0133 ╙┼╔          ─ISABLE INTERRUPTS.
  517.         0134 ╙╘┴ $01      ╙ELECT 64 K┬ ╥┴═ MEMORY CONFIGURATION.
  518.         0136 ╩═╨ $──┴4    ╩UMP TO THE MAIN PART.
  519.  
  520.   ╘HE MAIN PART ACTUALLY CONSISTS OF TWO PARTS. ╔T MAY BE A BIT
  521. COMPLICATED, AND IT MIGHT TEACH NEW TRICKS TO YOU.
  522.  
  523.         ──┴4 ╘╪┴
  524.         ──┴5 ╨╚┴          ╨USH ORIGINAL MEMORY CONFIGURATION ON STACK.
  525.         ──┴6 ╠─┴ $╞╞╞┴
  526.         ──┴9 ╨╚┴
  527.         ──┴┴ ╠─┴ $╞╞╞┬
  528.         ──┴─ ╨╚┴          ╙TORE THE ORIGINAL VALUES OF $╞╞╞┴ AND $╞╞╞┬.
  529.         ──┴┼ ╠─┴ #$16
  530.         ──┬0 ╙╘┴ $╞╞╞┴    ╙ET ($╞╞╞┴) TO POINT TO ╥╘╔.
  531.         ──┬3 ╠─┴ #$├0
  532.         ──┬5 ╙╘┴ $╞╞╞┬
  533.         ──┬8 ╩╙╥ $───├    ╙WAP THE AUXILIARY ROUTINES IN.
  534.         ──┬┬ ╩╙╥ $├000    ─ISABLE ╬═╔'S AND INITIALIZE ├╔┴2.
  535.         ──┬┼ ╨╠┴
  536.         ──┬╞ ╙╘┴ $╞╞╞┬    ╥ESTORE ORIGINAL VALUES TO $╞╞╞┴ AND $╞╞╞┬.
  537.         ──├2 ╨╠┴
  538.         ──├3 ╙╘┴ $╞╞╞┴
  539.         ──├6 ╩╙╥ $├01─    ╨RINT THE MESSAGE.
  540.         ──├9 ╩╙╥ $───├    ╙WAP THE AUXILIARY ROUTINES OUT.
  541.         ──├├ ╨╠┴
  542.         ──├─ ╘┴┘          ╠OAD ORIGINAL MEMORY CONFIGURATION TO ┘ REGISTER.
  543.         ──├┼ ╠─┴ #$00     ╨USH DESIRED STACK REGISTER VALUE ON STACK
  544.         ───0 ╨╚┴          (CLEAR ALL FLAGS, ESPECIALLY THE ╔ FLAG).
  545.         ───1 ╘╙╪
  546.         ───2 ╔╬├ $0102,╪  ╔NCREMENT THE RETURN ADDRESS.
  547.         ───5 ┬╬┼ $───┴    (╥╘╙ PREINCREMENTS IT, BUT ╥╘╔ DOES NOT.)
  548.         ───7 ╔╬├ $0103,╪
  549.         ───┴ ╙╘┘ $01      ╥ESTORE ORIGINAL MEMORY CONFIGURATION.
  550.  
  551.         (╘HE 6510 FETCHES THE NEXT INSTRUCTION FROM $───├, WHICH IS NOW
  552.         CONNECTED TO THE ├╔┴2'S REGISTER $├, THE ╙ERIAL ╨ORT REGISTER.
  553.         ╘HE INITIALIZATION ROUTINE WROTE AN ╥╘╔ TO IT. ╘HE PROCESSOR ALSO
  554.         READS FROM $──── AS A SIDE EFFECT OF THE INSTRUCTION FETCH,
  555.         THUS RE-ENABLING ╬═╔'S.)
  556.  
  557.         ───├ ╠─┘ #$3╞     ╙UBROUTINE: ╙WAP THE MEMORY AREAS $├000-$├03╞
  558.         ───┼ ╠─╪ $├000,┘              AND $──64-$──┴3 WITH EACH OTHER.
  559.         ──┼1 ╠─┴ $──64,┘
  560.         ──┼4 ╙╘┴ $├000,┘
  561.         ──┼7 ╘╪┴
  562.         ──┼8 ╙╘┴ $──64,┘
  563.         ──┼┬ ─┼┘
  564.         ──┼├ ┬╨╠ $───┼ 
  565.         ──┼┼ ╥╘╙
  566.  
  567.         ├000 ╔╬├ $01      ┼NABLE THE ╔/╧ AREA.
  568.         ├002 ╠─╪ #$81
  569.         ├004 ╙╘╪ $──0─    ┼NABLE ╘IMER ┴ INTERRUPTS OF ├╔┴2.
  570.         ├007 ╠─╪ #$00
  571.         ├009 ╙╘╪ $──05
  572.         ├00├ ╔╬╪
  573.         ├00─ ╙╘╪ $──04    ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
  574.         ├010 ╠─╪ #$──
  575.         ├012 ╙╘╪ $──0┼    ├AUSE AN INTERRUPT.
  576.  
  577.         (╘HE INSTRUCTION SETS ╙╨ TO OUTPUT, MAKES ╘IMER ┴ TO COUNT
  578.         SYSTEM CLOCK PULSES, FORCES THE ├╔┴ TO LOAD THE INITIAL VALUE
  579.         TO THE COUNTER, SELECTS ONE-SHOT COUNTING AND STARTS THE TIMER.)
  580.  
  581.         ├015 ╠─╪ #$40
  582.  
  583.         (╘HE PROCESSOR NOW JUMPS TO THE ╬═╔ HANDLER ($├016), AND
  584.         THE ╙╨ REGISTER STARTS TO ACT AS A MEMORY PLACE.)
  585.  
  586.         ├017 ╙╘╪ $──0├    ╫RITE AN ╥╘╔ TO ╙ERIAL ╨ORT REGISTER.
  587.         ├01┴ ─┼├ $01      ─ISABLE THE ╔/╧ AREA.
  588.         ├01├ ╥╘╙          ╥ETURN.
  589.  
  590.         ├01─ ╠─┴ $01
  591.         ├01╞ ╨╚┴
  592.         ├020 ╧╥┴ #$03     ┼NABLE ╔/╧ AND ╥╧═S.
  593.         ├022 ╙╘┴ $01
  594.         ├024 ╠─┘ #$0├     ╨RINT THE MESSAGE.
  595.         ├026 ╠─┴ $├033,┘
  596.         ├029 ╩╙╥ $╞╞─2
  597.         ├02├ ─┼┘
  598.         ├02─ ┬╨╠ $├026
  599.         ├02╞ ╨╠┴
  600.         ├030 ╙╘┴ $01      ╥ESTORE THE 64 K┬ MEMORY CONFIGURATION.
  601.         ├032 ╥╘╙
  602.  
  603.         ├033 "!─╠╥╧╫ ,╧╠╠┼╚"
  604.  
  605.         (╘HE STRING IS BACKWARDS IN MEMORY, SINCE ╔ DON'T WANT TO
  606.         WASTE CYCLES IN EXPLICIT COMPARISONS. ╘HIS METHOD RESULTS IN
  607.         MORE READABLE CODE THAN DOING A FORWARD LOOP WITH AN INDEX
  608.         VALUE $100-(NUMBER OF CHARACTERS).)
  609.  
  610.   ╘HIS PROGRAM IS NOT EXCELLENT. ╔T HAS THE FOLLOWING BUGS:
  611.  
  612.    O ╘HE 6510'S MEMORY MANAGEMENT LINES ╨0 AND ╨1 (╠╧╥┴═ AND ╚╔╥┴═,
  613.      RESPECTIVELY) ARE ASSUMED TO BE OUTPUTS. ╔F YOU ISSUED THE
  614.      COMMAND ╨╧╦┼0,╨┼┼╦(0)┴╬─252, THIS PROGRAM WOULD NOT WORK.
  615.      ╘HIS COULD BE EASILY CORRECTED BY SETTING THE ╨0 AND ╨1 LINES
  616.      TO OUTPUT IN THE BEGINNING OF THE INTERFACING ROUTINE (300 - 312):
  617.  
  618.         ╠─┴ $00
  619.         ╧╥┴ #$02
  620.         ╙╘┴ $00
  621.  
  622.    O ╘HE PROGRAM DOES NOT RESTORE THE ORIGINAL STATE OF THE ├╔┴2
  623.      ├ONTROL ╥EGISTER ┴ OR ╔NTERRUPT ├ONTROL ╥EGISTER. ╔T MIGHT BE
  624.      IMPOSSIBLE TO START USING THE ╦ERNAL'S ╥╙-232 ROUTINES AFTER
  625.      RUNNING THIS.
  626.  
  627.    O ╔F THE USER REDIRECTED OUTPUT TO CASSETTE OR ╥╙-232, INTERRUPTS
  628.      WOULD BE REQUIRED. ╚OWEVER, THEY ARE COMPLETELY DISABLED.
  629.  
  630.    O ╔F A NON-MASKABLE INTERRUPT OCCURS WHILE THE LOADER PART IS BEING
  631.      EXECUTED, THE PROGRAM WILL SCREW UP. ╘HIS WILL HAPPEN ALSO IN THE
  632.      MAIN PART, IF AN ╬═╔ IS ISSUED AFTER DISABLING ╥╧═S AND ╔/╧ IN
  633.      $0134 BUT BEFORE EXCHANGING THE CONTENTS OF THE MEMORY PLACES
  634.      $├016 AND $──7┴.
  635.  
  636.  
  637. _╞REEZER CARTRIDGES_
  638.  
  639. ╘HERE ARE MANY CARTRIDGES THAT LET YOU TO STOP ALMOST ANY PROGRAM FOR
  640. "BACK-UP" PURPOSES. ╧NE OF THE MOST POPULAR OF THESE FREEZER
  641. CARTRIDGES IS THE ┴CTION ╥EPLAY ╓╔ MADE BY ─ATEL ┼LECTRONICS BACK IN
  642. 1989. ╘HE CARTRIDGE HAS 8 KILOBYTES ╥┴═ AND 32 KILOBYTES ╥╧═ ON BOARD,
  643. AND IT HAS A CUSTOM CHIP FOR FIDDLING WITH THE ├64 CARTRIDGE PORT
  644. LINES -┼╪╥╧═, -╟┴═┼, -╔╥╤, -╬═╔ AND ┬┴.
  645.  
  646. ╔F THE -╬═╔ LINE IS NOT ASSERTED (THE ╬═╔ INTERRUPTS ARE ENABLED), ALL
  647. FREEZER CARTRIDGES SHOULD BE ABLE TO HALT ANY PROGRAM. ╫HEN THE USER
  648. PRESSES THE "FREEZE" BUTTON, THE CARTRIDGES HALT THE PROCESSOR BY
  649. DROPPING THE ┬┴ LINE LOW. ╘HEN THEY SWITCH SOME OF THEIR OWN ╥╧═ TO
  650. THE $┼000 - $╞╞╞╞ BLOCK BY SELECTING THE ╒LTI═AX CONFIGURATION WITH
  651. THE -┼╪╥╧═ AND -╟┴═┼ LINES. ┴FTER THIS, THEY ASSERT THE -╬═╔ LINE AND
  652. RELEASE THE ┬┴ LINE. ┴FTER COMPLETING THE CURRENT INSTRUCTION, THE
  653. PROCESSOR WILL TAKE THE ╬═╔ INTERRUPT AND LOAD THE PROGRAM COUNTER
  654. FROM THE VECTOR AT $╞╞╞┴, PROVIDED THAT THE ╬═╔ LINE WAS NOT ASSERTED
  655. ALREADY.
  656.  
  657. ╘HIS APPROACH IS PRONE TO MANY FLAWS. ╞IRSTLY, IF THE PROCESSOR IS
  658. EXECUTING A WRITE INSTRUCTION WHEN THE PROGRAM IS BEING HALTED, AND IF
  659. THE WRITE OCCURRED OUTSIDE THE AREA $0000 - $0╞╞╞, THE DATA WOULD GET
  660. LOST, IF THE ╒LTI═AX CONFIGURATION WAS ASSERTED TOO EARLY. ╘HIS CAN BE
  661. CORRECTED TO SOME EXTENT BY WAITING AT LEAST TWO CYCLES AFTER
  662. ASSERTING THE ┬┴ LINE, AS THE PROCESSOR WILL NOT STOP DURING WRITE
  663. CYCLES. ╚OWEVER, THIS IS OF NO HELP IF THE PROCESSOR HAS NOT GOTTEN TO
  664. THE WRITE STAGE YET.
  665.  
  666. ╙ECONDLY, IF THE INSTRUCTION BEING EXECUTED IS OUTSIDE THE AREA
  667. $0000 - $0╞╞╞, OR IF IT ACCESSES ANY DATA OUTSIDE THAT AREA, THE
  668. PROCESSOR WILL FETCH EITHER WRONG PARAMETERS OR INCORRECT DATA, OR
  669. BOTH. ╔F THE INSTRUCTION DOES NOT WRITE ANYTHING, WILL ONLY CORRUPT
  670. ONE PROCESSOR REGISTER.
  671.  
  672. ╘HIRDLY, IF THE ╬═╔ INTERRUPTS ARE DISABLED, PRESSING THE "FREEZE"
  673. BUTTON DOES NOT HAVE ANY OTHER IMMEDIATE EFFECT THAN LEAVING THE
  674. ╒LTI═AX MODE ASSERTED, WHICH MAKES ANY SYSTEM ╥┴═ OUTSIDE THE AREA
  675. $0000 - $0╞╞╞ UNAVAILABLE. ╔T ALSO FORCES THE ╔/╧ AREA ($─000 - $─╞╞╞)
  676. ON. ╔F THE PROGRAM HAS ANY INSTRUCTIONS OR DATA OUTSIDE THE LOWMOST
  677. FOUR KILOBYTES, IT WILL EVENTUALLY JAM, AS THAT DATA WILL BE SOMETHING
  678. ELSE THAN THE PROGRAM EXPECTS.
  679.  
  680. ╧NE MIGHT EXCEPT THAT READING FROM OPEN ADDRESS SPACE SHOULD RETURN
  681. RANDOM BYTES. ┬UT, IN AT LEAST TWO ├64'S, THE BYTES READ ARE MOSTLY
  682. $┬─, WHICH IS THE OPCODE FOR ╠─┴ ABSOLUTE,╪. ╙O, IF THE PROCESSOR HAS
  683. A "GOOD LUCK", IT WILL HAPPILY EXECUTE ONLY ╠─┴ $┬─┬─,╪ COMMANDS, AND
  684. IT MIGHT SURVIVE TO THE CARTRIDGE ╥╧═ AREA WITHOUT JAMMING. ╧R IT
  685. COULD EVENTUALLY FETCH A ┬╥╦ AND JUMP TO THE CARTRIDGE ╥╧═ VIA THE
  686. ╔╥╤/┬╥╦ VECTOR AT $╞╞╞┼. ╘HE ┴CTION ╥EPLAY ╓╔ HAS THE FAMILIAR
  687. AUTOSTART DATA IN THE BEGINNING OF BOTH THE ╥╧═╠ AND ╥╧═╚ BLOCKS BY
  688. DEFAULT, AND THAT DATA COULD BE INTERPRETED AS SENSIBLE COMMANDS. ╘HE
  689. ┴CTION ╥EPLAY ╓╔ WAS INDEED ABLE TO FREEZE MY TEST PROGRAM, EVEN
  690. THOUGH ╔ HAD COVERED ITS -╥┼╙┼╘, -╔╥╤ AND -╬═╔ LINES WITH A PIECE OF
  691. TAPE, UNTIL ╔ RELOCATED THE PROGRAM TO THE FIRST 4 KILOBYTE BLOCK.
  692.  
  693.  
  694. _┬UILDING AN UNBEATABLE FREEZER CIRCUIT_
  695.  
  696. ┴S YOU CAN SEE, IT IS TOTALLY IMPOSSIBLE TO DESIGN A FREEZER CARTRIDGE
  697. THAT FREEZES ANY PROGRAM. ╔F THE PROGRAM TO BE FREEZED HAS DISABLED
  698. THE ╬═╔ INTERRUPTS, AND IF ITS CODE RUNS MOSTLY AT $0000 - $0╞╞╞ OR
  699. $─000 - $─╞╞╞, THE COMPUTER WILL MORE PROBABLY HANG THAN SUCCEED IN
  700. FREEZING THE PROGRAM.
  701.  
  702. ╚OWEVER, IT IS POSSIBLE TO MAKE SOME INTERNAL MODIFICATIONS TO A ├64,
  703. SO THAT IT CAN FREEZE LITERALLY ANY PROGRAM. ┘OU NEED TO EXPAND YOUR
  704. MACHINE TO 256 KILOBYTES FOLLOWING THE DOCUMENTS ON FTP.FUNET.FI IN
  705. THE /PUB/CBM/HARDWARE/256K┬ DIRECTORY. ╔T WILL LET YOU TO RESET THE
  706. COMPUTER SO THAT ALL OF THE 64 KILOBYTES THE PREVIOUS PROGRAM USED,
  707. WILL REMAIN INTACT. ╔F YOU ADD A SWITCH TO ONE OF THE MEMORY EXPANSION
  708. CONTROLLER'S CHIP SELECTION LINES, THE PROGRAM BEING EXAMINED WILL
  709. HAVE NO WAY TO SCREW THE MACHINE UP, AS THE ADDITIONAL MEMORY MANAGEMENT
  710. REGISTERS WILL NOT BE AVAILABLE.
  711.  
  712. ┴ FEW ENHANCEMENTS TO THIS CIRCUIT ARE REQUIRED SO THAT YOU CAN FREEZE
  713. THE PROGRAMS WITHOUT LOSING THE STATE OF THE ╔/╧ CHIPS. ┘OU WILL ALSO
  714. NEED TO REPLACE THE ╦ERNAL ╥╧═ CHIP WITH YOUR OWN CODE, IF YOU DO NOT
  715. WANT TO LOSE THE STATE OF THE ┴, ╪, ╨ AND ╙ REGISTERS. ╒NFORTUNATELY
  716. THIS CIRCUIT WILL NOT PRESERVE THE STATE OF THE PROCESSOR'S ╨ERIPHERAL
  717. LINES (ITS BUILT-IN ╔/╧ PORT MAPPED TO THE MEMORY ADDRESSES 0 AND 1),
  718. NOR DOES IT RECORD THE PROGRAM COUNTER (╨├). ╔ HAVE A PARTIAL SOLUTION
  719. TO THE ╨├ PROBLEM, THOUGH.
  720.  
  721. ╔F YOU ARE INTERESTED IN THIS PROJECT, CONTACT ME. ╔ WILL DESIGN THE
  722. ADDITIONAL HARDWARE, AND ╔ WILL PROGRAM THE STARTUP ROUTINES, BUT ╔
  723. CERTAINLY DO NOT HAVE THE TIME TO PROGRAM ALL OF THE FREEZER SOFTWARE.
  724. ═OST OF THE FREEZER SOFTWARE COULD BE IN ╥┴═, SO IT WOULD BE VERY EASY
  725. TO DEVELOP IT, AND YOU COULD EVEN USE EXISTING TOOLS BY PATCHING THEM
  726. SLIGHTLY.
  727.  
  728. =============================================================================
  729. ╞╠─ - ╙CROLLING THE SCREEN
  730. BY ═AREK ╦LAMPAR (KLAMPAR@ELF.STUBA.SK)
  731.  
  732.  
  733.                              ╙CROLLING THE SCREEN
  734.                              --------------------
  735.       [INSPIRATED BY ╨ASI ╧JALA ARTICLE '╧PENING THE BORDERS' FROM ISSUE#6]
  736.  
  737. ╞ROM ╨ASI '┴LBERT' ╧JALA'S (PO87553@CS.TUT.FI OR ALBERT@CC.TUT.FI) ARTICLE:
  738.  
  739.   _╙CROLLING THE SCREEN_
  740.  
  741.   ╓╔├ BEGINS TO DRAW THE SCREEN FROM THE FIRST BAD LINE. ╓╔├ WILL KNOW
  742.   WHAT LINE IS A BAD LINE BY COMPARING ITS SCAN LINE COUNTER TO THE
  743.   VERTICAL SCROLL REGISTER : WHEN THEY MATCH, THE NEXT LINE IS A BAD
  744.   LINE. ╔F WE CHANGE THE VERTICAL SCROLL REGISTER ($D011), THE FIRST BAD
  745.   LINE WILL MOVE ALSO. ╔F WE DO THIS ON EVERY LINE, THE LINE COUNTER IN
  746.   ╓╔├ WILL NEVER MATCH WITH IT AND THE DRAWING NEVER STARTS (UNTIL IT IS
  747.   ALLOWED TO DO SO).
  748.  
  749.   ╫HEN WE DON'T HAVE TO WORRY ABOUT BAD LINES, WE HAVE ENOUGH TIME TO
  750.   OPEN THE BORDERS AND DO SOME OTHER EFFECTS TOO. ╔T IS NOT NECASSARY TO
  751.   CHANGE THE VERTICAL SCROLL ON EVERY LINE TO GET RID OF THE BAD LINES,
  752.   JUST MAKE SURE THAT IT NEVER MATCHES THE LINE COUNTER (OR ACTUALLY THE
  753.   LEAST SIGNIFICANT 3 BITS).
  754.  
  755.   ┘OU CAN EVEN SCROLL THE BAD LINES INDEPENDENTLY AND YOU HAVE ╞╠─ -
  756.   ╞LEXIBLE ╠INE ─ISTANCE. ┘OU JUST ALLOW A BAD LINE WHEN IT IS TIME TO
  757.   DISPLAY THE NEXT CHARACTER ROW. ╫ITH THIS YOU CAN BOUNCE THE LINES OR
  758.   SCROLL A HIRES PICTURE VERY FAST DOWN THE SCREEN.
  759.  
  760. (*** END OF ┴LBERT'S PARAGRAPH ***)
  761.  
  762.   ╫ELL, EVERYTHING IMPORTANT WAS WRITTEN. ╔'M JUST ADDING THIS:
  763.  
  764. ╞OR MOVING HIRES PICTURE REPLACE ╧╥┴ #$10 BY ╧╥┴ #$30.
  765.  
  766. ╞OR ANOTHER ╞╪ TRY TO REPLACE PART OF IRQ ROUTINE BEGINING WITH ╧╥┴ #$10 BY:
  767.         ╧╥┴ #$├0
  768.         ╙╘┴ $─016,
  769. REMOVE  ╩╙╥ ├╚╧╞╙,
  770. REPLACE ╠─╪ ╧╞╙┼╘
  771. BY      ╠─╪ #$FF
  772. AND ENJOY =)
  773.  
  774.  
  775. ╘HE DEMONSTARTION PROGRAM FOR ╞╠─ APPLICATION
  776. ;---------------------------------------
  777. ; ├OMMODORE ├RACKER 1993
  778. ;---------------------------------------
  779. ╞╥╧═    = $32
  780. ╘╧      = $╞┴
  781. ;---------------------------------------
  782.       *= $├000
  783. ;---------------------------------------
  784. ╔╬╔╘    ╠─┴ #0
  785.       ╙╘┴ ─╔╥     ; ─IRECTION
  786.       ╠─┴ #$╞╞    ; ╙ET GARBAGE
  787.       ╙╘┴ $3╞╞╞
  788.       ╠─┴ #╞╥╧═
  789.       ╙╘┴ ╧╞╙┼╘   ; ╙ET OFSET
  790.       ╙┼╔         ; ─ISABLE INTERRUPT
  791.       ╠─┴ #$7╞    ; ─ISABLE TIMER INTERRUPT
  792.       ╙╘┴ $─├0─
  793.       ╠─┴ #1      ; ┼NABLE RASTER INTERRUPT
  794.       ╙╘┴ $─01┴
  795.       ╠─┴ #<╔╥╤   ; ╙ET IRQ VECTOR
  796.       ╙╘┴ $0314
  797.       ╠─┴ #>╔╥╤
  798.       ╙╘┴ $0315
  799.       ╠─┴ #0      ; ╘O EVOKE OUR IRQ ROUTINE ON 0TH LINE
  800.       ╙╘┴ $─012
  801.       ├╠╔         ; ┼NABLE INTERRUPT
  802.       ╥╘╙
  803. ;---------------------------------------
  804. ╔╥╤     ╠─╪ ╧╞╙┼╘
  805. ╠2    ╠─┘ $─012   ; ═OVING 1ST BAD LINE
  806. ╠1    ├╨┘ $─012
  807.       ┬┼╤ ╠1      ; ╫AIT FOR BEGIN OF NEXT LINE
  808.       ─┼┘         ; ╔┘ - BAD LINE
  809.       ╘┘┴
  810.       ┴╬─ #$07    ; ├LEAR HIGHER 5 BITS
  811.       ╧╥┴ #$10    ; ╙ET TEXT MODE
  812.       ╙╘┴ $─011
  813.       ─┼╪
  814.       ┬╬┼ ╠2
  815.       ╔╬├ $─019   ; ┴CKNOWLEDGE THE RASTER INTERRUPT
  816.       ╩╙╥ ├╚╧╞╙
  817.       ╩═╨ $┼┴31   ; ─O STANDARD IRQ ROUTINE
  818. ;---------------------------------------
  819. ╧╞╙┼╘ .┬┘╘┼ ╞╥╧═
  820. ─╔╥   .┬┘╘┼ 0
  821. ;---------------------------------------
  822. ├╚╧╞╙ ╠─┴ ─╔╥     ; ├HANGE ╧╞╙┼╘ OF SCREEN
  823.       ┬╬┼ ╒╨
  824.       ╔╬├ ╧╞╙┼╘   ; ─OWN
  825.       ╠─┴ ╧╞╙┼╘
  826.       ├═╨ #╘╧
  827.       ┬╬┼ ╙╦╔╨
  828.       ╙╘┴ ─╔╥
  829. ╙╦╔╨    ╥╘╙
  830. ;---------------------------------------
  831. ╒╨    ─┼├ ╧╞╙┼╘   ; ╒P
  832.       ╠─┴ ╧╞╙┼╘
  833.       ├═╨ #╞╥╧═
  834.       ┬╬┼ ╙╦╔╨
  835.       ╠─┴ #0
  836.       ╙╘┴ ─╔╥
  837.       ╥╘╙
  838.  
  839. =============================================================================
  840. ╘ECH-TECH - MORE RESOLUTION TO VERTICAL SHIFT.
  841. BY ╨ASI '┴LBERT' ╧JALA (PO87553@CS.TUT.FI _OR_ ALBERT@CC.TUT.FI)
  842. ╫RITTEN ON 16-═AY-91  ╘RANSLATION 02-╩UN-92
  843.  
  844. (┴LL TIMINGS ARE IN ╨┴╠, PRINCIPLES WILL APPLY TO ╬╘╙├ TOO)
  845.  
  846. ╧NE TIME HALF OF THE DEMOS HAD PICTURES WAVING HORIZONTALLY ON THE
  847. WIDTH OF THE WHOLE SCREEN. ╘HIS EFFECT IS NAMED TECH-TECH, AND THE
  848. AUDIENCE WAS PUZZLED. ┘OU CAN MOVE THE SCREEN ONLY EIGHT PIXELS USING
  849. THE HORIZONTAL SCROLL REGISTER. ╘HIS EFFECT WAS DONE USING CHARACTER
  850. GRAPHICS. ╚OW EXACTLY AND IS THE SAME POSSIBLE WITH SPRITES ?
  851.  
  852.  
  853. ╚ORIZONTAL SCROLL REGISTER CAN MOVE THE SCREEN BY EIGHT PIXELS. ╘HIS
  854. ISN'T EVEN NEARLY ENOUGH TO PRODUCE A REALLY STUNNING EFFECT. ┘OU HAVE
  855. TO MOVE THE GRAPHICS ITSELF, FORTUNATELY WITH A RESOLUTION OF ONE
  856. CHARACTER POSITION (ONE BYTE) ONLY, THE REST CAN BE DONE WITH THE SCROLL
  857. REGISTER. ─URING ONE SCAN LINE THERE IS NO TIME TO MOVE THE ACTUAL DATA,
  858. YOU CAN ONLY MOVE A POINTER. ├HANGING THE VIDEO MATRIX POINTER WON'T
  859. HELP, BECAUSE ╓╔├ (VIDEO INTERFACE CONTROLLER) WILL FETCH THE CHARACTER
  860. CODES ONLY AT CERTAIN TIMES, CALLED BAD LINES. ┘OU CAN CHANGE THE
  861. CHARACTER SET POINTER INSTEAD, BECAUSE ╓╔├ READS THE DATA IT DISPLAYS
  862. DIRECTLY FROM THE CHARACTER SET MEMORY.
  863.  
  864.  
  865. ├HARACTER SET-IMPLEMENTATION HAS ITS RESTRICTIONS
  866.  
  867. ┬ECAUSE HORIZONTAL MOVEMENT IS DONE BY CHANGING THE CHARACTER SETS, THE
  868. PICTURE OR TEXT MUST BE PURE GRAPHIC AND THE CHARACTER CODES IN THE
  869. VIDEO MATRIX MUST BE IN A NUMERICAL ORDER. ╘HE NORMAL PICTURE IS IN THE
  870. FIRST CHARACTER MEMORY AND IN THE NEXT ONE IT IS SHIFTED ONE CHARACTER
  871. POSITION TO THE RIGHT. ╧NE VIDEO BANK CAN HOLD ONLY SEVEN FULL CHARACTER
  872. MEMORIES BESIDES THE VIDEO MATRIX. ╘HIS LIMITS THE MOVEMENT OF THE
  873. PICTURE TO 56 PIXELS. ╔T IS POSSIBLE TO GET MORE MOVEMENT IF YOU USE
  874. SMALLER PICTURE OR ANOTHER VIDEO BANK.
  875.  
  876. ╘HE SHIFT IS DONE SO THAT ON EACH SCAN LINE WE UPDATE THE HORIZONTAL
  877. SCROLL REGISTER ($─016) WITH THE THREE LOWEST BITS OF THE SHIFT VALUE.
  878. ╫E USE THE OTHER BITS TO SELECT THE RIGHT CHARACTER SET ($─018). ╔N A
  879. TECH-TECH THE SHIFT VALUE CHANGES DURING THE DISPLAY OF THE WHOLE
  880. PICTURE, AND THE VALUES ARE STORED IN A TABLE. ╔N ADDITION TO THAT, THE
  881. SHIFT VALUES SHOULD BE PUT INTO TWO TABLES, ONE FOR THE HORIZONTAL
  882. SCROLL REGISTER AND ANOTHER FOR THE CHARACTER SET SELECT. ╘HIS IS
  883. NECESSARY, BECAUSE THERE IS NO TIME FOR EXTRA CALCULATIONS ON A BAD
  884. LINE.
  885.  
  886. ┬ECAUSE WE HAVE TO CHANGE THE CHARACTER SET AND X-SCROLL DYNAMICALLY, WE
  887. ALSO NEED A RASTER ROUTINE TO SHOW A TECH-TECH. ┴ RASTER ROUTINE IS A
  888. ROUTINE WHICH IS SYNCHRONIZED TO THE ELECTRON BEAM. ╘HIS EATS UP THE
  889. PROCESSOR TIME: THE BIGGER THE PICTURE, THE LESS TIME IS LEFT OVER FOR
  890. OTHER ACTIVITIES. ╧N OTHER THAN BAD LINES YOU CAN DO OTHER FUNNY THINGS,
  891. LIKE CHANGE THE COLOR OF THE BACKGROUND OR BORDER.
  892.  
  893.  
  894. ┴N EXAMPLE PROGRAM
  895.  
  896. ╘HE DEMO PROGRAM USES VIDEO BANK 2, MEMORY ADDESSES $4000-7FFF. ╘HE
  897. VIDEO MATRIX IS IN THE BEGINNING OF THE BANK. ╧NLY INVERTED CHARS ARE
  898. USED FOR THE GRAPHICS, THIS WAY WE HAVE ALL EIGHT CHARACTER MEMORIES
  899. AVAILABLE AND THE MAXIMUM SHIFT IS 64 PIXELS. ╘HE AREA FOR THE TECH-TECH
  900. IN THE VIDEO MATRIX IS EIGHT CHARACTER ROWS HIGH, BUT IT HAS IDENTICAL
  901. GRAPHICS ON EVERY LINE. ╘HIS IS WHY WE USE ONLY 320 BYTES FROM EACH
  902. CHARACTER SET.
  903.  
  904. ┘OU CAN USE A JOYSTICK TO CONTROL THE MOVEMENT OF THE TECH-TECH. ╘HE
  905. STICK DECREASES OR INCREASES THE SHIFT ADD VALUE IN A RESOLUTION OF A
  906. HALF PIXEL. ╫HEN THE SHIFT REACHES ITS HIGHEST/LOWEST VALUE, THE
  907. DIRECTION OF THE ADD IS REVERSED. ╩UST EXPERIMENT WITH IT.
  908.